/*********************************************************************
 * std::lambda的一般用法总结：
 * 1、什么是lambda
 *    lambda是一种匿名函数，方便在表达式中直接使用。
 * 2、为什么需要lambda
 *     有时候需要将一段代码赋值给一个变量，用这个变量代替代码的执行。如在
 *     一个函数中一段代码需要频繁执行，一种方式是抽取函数，另一种方式就是使用
 *     lambda表达式，用变量替代代码段，其他地方使用变量即可。
 * 3、如何使用lambda
 *    见下述实现
 * ******************************************************************/
#include "common.h"

std::function<void(int)> func()
{
    return [] (int e) { std::cout << e << std::endl;};
}

int main()
{
    // 1、lambda表达式的常规用法
    int val = 10;
    auto temp = [val](int count) {
        if (count > val) {
            return 1;
        } else {
            return 0;
        }
    };
    printf("this is val = %d\n", temp(1));  // 0，其中temp就是匿名函数xxx(int count)
    printf("this is val = %d\n", temp(12));  // 1

    // 2、lambda表达式更多的是用在STL中，如vec的排序
    std::vector<int> vec = {3, 5, 1, 8, 12, 89};
    sort(vec.begin(), vec.end(), [](int val1, int val2){
        if (val1 > val2) {
            return false;
        } else {
            return true;
        }
    });
    for (const auto& item : vec) {
        printf("vec val = %d\n", item);
    }

    // lambda表达式中捕获列表是不可缺少的，因为捕获列表代表中lambda表达式的起始地点
    // 捕获列表不同于参数列表，是因为捕获列表中的数值全部是表达式之前的确定值，如上例中的
    // val,而参数count只有当执行到lambda表达式时才能确定，之前都是不可预知的。

    ///3、lambda表达式可以作为函数返回值
    func()(10);

    return 0;
}